package com.lingxu.base.system.dict.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lingxu.base.common.api.vo.Result;
import com.lingxu.base.system.dict.entity.SysDict;
import com.lingxu.base.system.dict.entity.SysDictItem;
import com.lingxu.base.system.dict.mapper.SysDictItemMapper;
import com.lingxu.base.system.dict.mapper.SysDictMapper;
import com.lingxu.base.system.dict.service.SystemDictService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;


@Service
public class SystemDictServiceImpl implements SystemDictService {

    private Logger logger = LoggerFactory.getLogger(SystemDictServiceImpl.class);
    @Autowired
    private SysDictMapper sysDictMapper;
    @Autowired
    private SysDictItemMapper sysDictItemMapper;
    @Autowired
    @Lazy
    private SystemDictService systemDictService;

    @Override
    public Result addSysDict(SysDict sysdict) {
        try {
            //校验唯一性
            Integer one = sysDictMapper.findOnlyOneCode(sysdict.getCode());
            if(one > 0){
                return Result.ok("当前字典代码已存在【" + sysdict.getCode() + "】");
            }
//            SysDict.setId(UUID32Generator.generate());
            int i = sysDictMapper.insert(sysdict);
            systemDictService.updateSystemDictCache("HAPTSysDict");
            if(i > 0){
                return Result.ok("操作成功");
            }
            return Result.error("操作失败");
        }catch (Exception e){
            logger.error("新增数据字典类别列表操作异常:",e);
            return Result.error("操作异常");
        }
    }


    @Override
    public Result addSysDictItem(SysDictItem sysDictItem) {
        try {
            SysDictItem onlyOne = sysDictItemMapper.findOnlyOne(sysDictItem);
            if(onlyOne != null){
                StringBuilder builder = new StringBuilder();
                if(sysDictItem.getName().equals(onlyOne.getName())){
                    builder.append("中文名").append(",");
                }
                if(onlyOne.getValue() != null){
                    builder.append("代码值").append(",");
                }
                return Result.error("操作失败,当前字典出现重复字段" + builder + "请重新填写！");
            }
            int i = sysDictItemMapper.insert(sysDictItem);
            systemDictService.updateSystemDictCache("HAPTSysDict");
            if(i > 0){
                return Result.ok("操作成功");
            }
            return Result.error("操作失败");
        }catch (Exception e){
            logger.error("新增字典详情操作异常:",e);
            return Result.error("操作异常");
        }
    }


    @Override
    public Result updateSysDict(SysDict SysDict) {
        int i = sysDictMapper.updateById(SysDict);
        systemDictService.updateSystemDictCache("HAPTSysDict");
        if(i > 0){
            return Result.ok("操作成功");
        }
        return Result.error("操作失败");
    }


    @Override
    public Result updateSysDictItem(SysDictItem sysDictItem) {
        try {
            SysDictItem onlyOne = sysDictItemMapper.findOnlyOne(sysDictItem);
            if(onlyOne != null){
                if(!sysDictItem.getName().equals(onlyOne.getName())){
                    Integer oneByCname = sysDictItemMapper.findOneByName(sysDictItem.getDictcode(), sysDictItem.getName());
                    if(oneByCname > 0){
                        return Result.error("操作失败,当前字典出现重复字段【" + sysDictItem.getName() + "】请重新填写！");
                    }
                }
                if(!sysDictItem.getValue().equals(onlyOne.getValue())){
                    Integer oneByCname = sysDictItemMapper.findOneByValue(sysDictItem.getDictcode(), sysDictItem.getValue());
                    if(oneByCname > 0){
                        return Result.error("操作失败,当前字典出现重复字段【" + sysDictItem.getValue() + "】请重新填写！");
                    }
                }
            }
            int i = sysDictItemMapper.updateById(sysDictItem);
            systemDictService.updateSystemDictCache("HAPTSysDict");
            if(i > 0){
                return Result.ok("操作成功");
            }
            return Result.error("操作失败");
        }catch (Exception e){
            logger.error("修改字典详情操作异常:",e);
            return Result.error("操作异常");
        }

    }


    @Override
    public Result deleteSysDict(String id) {
        if(id.contains(",")){
            String[] split = id.split(",");
            List<String> list = Arrays.asList(split);
            for(String dictid:list){
                sysDictItemMapper.deleteByDictId(dictid);
            }
            int i = sysDictMapper.deleteBatchIds(list);
            systemDictService.updateSystemDictCache("HAPTSysDict");
            if(i > 0){
                return Result.ok("操作成功");
            }
        }else{
            sysDictItemMapper.deleteByDictId(id);
            int i = sysDictMapper.deleteById(id);
            systemDictService.updateSystemDictCache("HAPTSysDict");
            if(i > 0){
                return Result.ok("操作成功");
            }
        }

        return Result.error("操作失败");
    }


    @Override
    public Result deleteSysDictItem(String id) {
        String[] split = id.split(",");
        List<String> list = Arrays.asList(split);
        int i = sysDictItemMapper.deleteBatchIds(list);
        systemDictService.updateSystemDictCache("HAPTSysDict");
        if(i > 0){
            return Result.ok("操作成功");
        }
        return Result.error("操作失败");
    }

    @Override
    public Result findSysDictList(Integer pageNo, Integer pageSize, String keyWord) {
        Result result = new Result();
        Page<SysDict> page = new Page<>(pageNo,pageSize);
        IPage<SysDict> info = sysDictMapper.findSysDictList(page,keyWord);
        result.setCode(200);
        result.setSuccess(true);
        result.setMessage("查询成功");
        result.setResult(info);
        return result;
    }

    @Override
    public Result findSysDictItemList(String dictid) {
        List<SysDictItem> list = sysDictItemMapper.findSysDictItemListByDictId(dictid);
        return Result.ok(list);
    }

    @Override
    @Cacheable(value = "HAPTSysDict",key = "#HAPTSysDict")
    public Result findSystemDictCache(String HAPTSysDict) {
        try {
            return Result.ok(sysDictMapper.findSystemDictCache(),"查询成功");
        }catch (Exception e){
            logger.error("数据查询异常",e);
            return Result.error("查询异常");
        }
    }


    @Override
    @CachePut(value = "HAPTSysDict",key = "#HAPTSysDict")
    public Result updateSystemDictCache(String HAPTSysDict) {
        try {
            return Result.ok(sysDictMapper.findSystemDictCache(),"查询成功");
        }catch (Exception e){
            logger.error("数据查询异常",e);
            return Result.error("查询异常");
        }
    }
    @Override
    @Cacheable(value = "HAPTSysTreeDict",key = "#HAPTSysTreeDict")
    public Result findSystemDictTree(String HAPTSysTreeDict) {
        try {
            return Result.ok(sysDictMapper.findSystemDictTree(),"查询成功");
        } catch (Exception e) {
            logger.error("数据查询异常",e);
            return Result.error("查询异常");
        }
    }

    @Override
    @CachePut(value = "HAPTSysTreeDict",key = "#HAPTSysTreeDict")
    public Result updateSystemDictTreeCache(String HAPTSysTreeDict) {
        try {
            return Result.ok(sysDictMapper.findSystemDictTree(),"查询成功");
        } catch (Exception e) {
            logger.error("数据查询异常",e);
            return Result.error("查询异常");
        }
    }

//    /**
//     * @Author ysj闫世杰
//     * @Description 根据id查询字典类别详情
//     * @Date 2021/6/7 10:14
//     * @Param: id
//     * @return com.lingxu.base.common.api.vo.Result
//     **/
//    @Override
//    public Result findDictDetailsById(String id) {
//        return Result.ok(SysDictItemMapper.findDictDetailsById(id),"查询成功");
//    }
//
//    /**
//     * @Author ysj闫世杰
//     * @Description 根据id查询字典明细详情
//     * @Date 2021/6/7 10:28
//     * @Param: id
//     * @return com.lingxu.base.common.api.vo.Result
//     **/
//    @Override
//    public Result findDictInfoDetailsById(String id) {
//        return Result.ok(SysDictItemMapper.findDictInfoDetailsById(id),"查询成功");
//    }
//
//    /**
//     * @Author ysj闫世杰
//     * @Description 查询所有字典放入缓存
//     * @Date 2021/9/2 11:06
//     * @Param: SysDict
//     * @return com.lingxu.base.common.api.vo.Result
//     **/
//    @Override
//    @Cacheable(value = "SysDict",key = "#SysDict")
//    public Result findSystemDictCache(String SysDict) {
//        try {
//            return Result.ok(sysDictMapper.findSystemDictCache(),"查询成功");
//        }catch (Exception e){
//            logger.error("数据查询异常",e);
//            return Result.error("查询异常");
//        }
//    }
//
//    /**
//     * @Author ysj闫世杰
//     * @Description 查询所有字典放入缓存
//     * @Date 2021/9/2 11:06
//     * @Param: SysDict
//     * @return com.lingxu.base.common.api.vo.Result
//     **/
//    @Override
//    @CachePut(value = "SysDict",key = "#SysDict")
//    public Result updateSystemDictCache(String SysDict) {
//        try {
//            return Result.ok(sysDictMapper.findSystemDictCache(),"查询成功");
//        }catch (Exception e){
//            logger.error("数据查询异常",e);
//            return Result.error("查询异常");
//        }
//    }
//
//    /**
//     * @Author ysj闫世杰
//     * @Description 查询行政区划放入缓存
//     * @Date 2021/9/6 17:08
//     * @Param: city
//     * @return com.lingxu.base.common.api.vo.Result
//     **/
//    @Override
//    @Cacheable(value = "city",key = "#city")
//    public Result findSystemDictCityCache(String city) {
//        try {
//            return Result.ok(sysDictMapper.findSystemDictCityCache(),"查询成功");
//        }catch (Exception e){
//            logger.error("数据查询异常",e);
//            return Result.error("查询异常");
//        }
//    }
//
//    /**
//     * @Author ysj闫世杰
//     * @Description 更新行政区划缓存
//     * @Date 2021/9/6 17:08
//     * @Param: city
//     * @return com.lingxu.base.common.api.vo.Result
//     **/
//    @Override
//    @CachePut(value = "city",key = "#city")
//    public Result updateSystemDictCityCache(String city) {
//        try {
//            return Result.ok(sysDictMapper.findSystemDictCityCache(),"查询成功");
//        }catch (Exception e){
//            logger.error("数据查询异常",e);
//            return Result.error("查询异常");
//        }
//    }
//
//    @Override
//    @Cacheable(value = "SysTreeDict",key = "#SysTreeDict")
//    public Result findSystemDictTree(String SysTreeDict) {
//        try {
//            return Result.ok(sysDictMapper.findSystemDictTree(),"查询成功");
//        } catch (Exception e) {
//            logger.error("数据查询异常",e);
//            return Result.error("查询异常");
//        }
//    }
//
//    @Override
//    @CachePut(value = "SysTreeDict",key = "#SysTreeDict")
//    public Result updateSystemDictTreeCache(String sysTreeDict) {
//        try {
//            return Result.ok(sysDictMapper.findSystemDictTree(),"查询成功");
//        } catch (Exception e) {
//            logger.error("数据查询异常",e);
//            return Result.error("查询异常");
//        }
//    }
}
